package org.myapp.page.login;

import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.panel.Panel;

import org.myapp.constants.UserAuthority;
import org.myapp.datastore.AutoQuery;
import org.myapp.datastore.entity.User;
import org.myapp.datastore.model.UserModel;
import org.myapp.page.ParentPage;
import org.myapp.page.login.component.ChgFrmLink;
import org.myapp.page.login.form.LoginFormModel;
import org.myapp.page.login.panel.ChangePanel;
import org.myapp.page.login.panel.RegistPanel;
import org.myapp.page.login.panel.SigninPanel;

import com.google.appengine.api.datastore.Entity;

/**
 * トップページ.<br>
 *
 * @author Administrator
 *
 */
public class TopPage extends ParentPage {

    /** 表示中のフォーム */
    private Panel activePnl = null;
    /** 非表示中のリンク */
    private AjaxLink<Void> hiddenLink = null;

    /** サインインフォームを表示するリンク */
    private final ChgFrmLink sLnk = new ChgFrmLink("lnkSignin", false) {

        private static final long serialVersionUID = -5637676709295488618L;

        @Override
        public void onClick(AjaxRequestTarget arg0) {
            view(hiddenLink, this, arg0);
            view(sPnl, activePnl, arg0);

            updateState(sPnl, this);
        }
    };
    /** 登録フォームを表示するリンク */
    private final ChgFrmLink rLnk = new ChgFrmLink("lnkRegist", true) {

        private static final long serialVersionUID = -5637676709295488618L;

        @Override
        public void onClick(AjaxRequestTarget arg0) {
            view(hiddenLink, this, arg0);
            view(rPnl, activePnl, arg0);

            updateState(rPnl, this);
        }
    };
    /** パスワード変更フォームを表示するリンク */
    private final ChgFrmLink cLnk = new ChgFrmLink("lnkChange", true) {

        private static final long serialVersionUID = -5637676709295488618L;

        @Override
        public void onClick(AjaxRequestTarget arg0) {
            view(hiddenLink, this, arg0);
            view(cPnl, activePnl, arg0);

            updateState(cPnl, this);
        }
    };

    /** ログインフォームのモデル */
    private LoginFormModel loginModel = null;
    /** サインインパネル */
    private SigninPanel sPnl = null;
    /** ユーザ登録パネル */
    private RegistPanel rPnl = null;
    /** パスワード変更パネル */
    private ChangePanel cPnl = null;

    /**
     * コンストラクタ.<br>
     * 初期表示.<br>
     */
    public TopPage(){

        loginModel = new LoginFormModel();
        sPnl = new SigninPanel("signinDiv", loginModel, true);
        rPnl = new RegistPanel("registDiv", loginModel, false);
        cPnl = new ChangePanel("changeDiv", loginModel, false);

        add(sLnk,rLnk,cLnk,sPnl,rPnl,cPnl);

        updateState(sPnl, sLnk);

        AutoQuery query = new AutoQuery(User.ENTITY.getId());
        List<Entity> list = query.asList();
        for (Entity entity : list) {
            UserModel model = new UserModel(entity);
            model.delete();
        }

        // TODO 管理者投入
        UserModel model = new UserModel();
        model.setUserId("adminuser");
        model.setPassword("adminuser");
        model.setUserAuthority(UserAuthority.ADMIN);
        model.save();
    }

    /**
     * 表示・非表示切り替え.<br>
     * @param viewTarget 表示対象のコンポーネント
     * @param hidTarget 非表示対象のコンポーネント
     * @param target AjaxTarget
     */
    private void view(Component viewTarget, Component hidTarget, AjaxRequestTarget target) {
        viewTarget.setVisible(true);
        hidTarget.setVisible(false);
        target.addComponent(viewTarget);
        target.addComponent(hidTarget);
    }

    /**
     * 最新の表示状態.<br>
     * @param viewTarget 表示対象(フォーム)
     * @param hidTarget 非表示対象(リンク)
     */
    private void updateState(Panel activePanel, AjaxLink<Void> hiddenLink) {
        this.activePnl = activePanel;
        this.hiddenLink = hiddenLink;
    }
}